﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using log4net;

namespace TheBullysStore.Models.ModuloAdministracion.Gasto
{
    public class GastoDAO
    {
        private static ILog log = LogManager.GetLogger(typeof(GastoDAO));
        public string RegistrarGasto(GastoBean gasto)
        {
            SqlConnection sqlCon = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                List<GastoBean> listaGasto = new List<GastoBean>();
                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "INSERT INTO  documento_de_pago (id_Edificio, tipo_gasto, tipo_documento_pago, Nro_Documento, Monto, " +
                "id_proveedor, Fecha_Registro, descripcion, Estado) VALUES (" + gasto.IdEdificio + ", " + gasto.TipoGasto + ", " +
                gasto.TipoDocumentoPago + ", '" + gasto.NumeroDocumento + "', " + gasto.Monto + ", " + gasto.IdProveedor + ", " + "convert(datetime,'" +
                gasto.FechaRegistro + "',103), '" + gasto.Descripcion + "', " + +gasto.Estado + ")";
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

                gasto.Conexion = "Bien";

            }

            catch (Exception ex)
            {
                log.Error("RegistrarGasto(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
            return gasto.Conexion;
        }

        public List<GastoBean> ListarGasto(GastoBean gasto)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<GastoBean> listaGasto = new List<GastoBean>();

                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "SELECT dp.*, e.Nombre, p.RazonSocial, tdp.descripcion, tg.descripcion FROM documento_de_pago dp, edificio e, Proveedor p, tipo_documento_pago tdp, tipo_gasto tg WHERE " +
                "p.id_proveedor=dp.id_proveedor and e.id_Edificio=dp.id_Edificio and dp.tipo_gasto = tg.tipo_gasto and dp.tipo_documento_pago = tdp.tipo_documento_pago";

                if (gasto.IdEdificio != 0) commandString += " and dp.id_Edificio =" + gasto.IdEdificio;
                if (gasto.TipoGasto != 0) commandString += " and dp.tipo_gasto =" + gasto.TipoGasto;
                if (gasto.TipoDocumentoPago != 0) commandString += " and dp.tipo_documento_pago=" + gasto.TipoDocumentoPago;
                if (gasto.Estado != -1) commandString += " and dp.Estado=" + gasto.Estado;
                if (gasto.IdProveedor != 0) commandString += " and dp.id_proveedor=" + gasto.IdProveedor;
                if (gasto.FechaInicio != null) commandString += " and convert(datetime,'" + gasto.FechaInicio + "',103) <= dp.Fecha_Registro";
                if (gasto.FechaFin != null) commandString += " and convert(datetime,'" + gasto.FechaFin + "',103) >= dp.Fecha_Registro";
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    GastoBean gastoBean = new GastoBean();
                    gastoBean.IdEdificio = (int)dataReader[0];
                    gastoBean.Monto = Convert.ToDouble(dataReader[1]);
                    gastoBean.FechaRegistro = ((DateTime)dataReader[2]).ToString("dd/MM/yyyy");
                    gastoBean.Estado = (int)dataReader[3];
                    gastoBean.NumeroDocumento = (string)dataReader[4];
                    gastoBean.IdProveedor = (int)dataReader[5];
                    gastoBean.Descripcion = (string)dataReader[6];
                    gastoBean.IdDocumento = (int)dataReader[7];
                    gastoBean.TipoDocumentoPago = (int)dataReader[8];
                    gastoBean.TipoGasto = (int)dataReader[9];
                    gastoBean.NombreEdificio = (string)dataReader[10];
                    gastoBean.NombreProveedor = (string)dataReader[11];
                    gastoBean.TipoDocumentoPagoNombre = (string)dataReader[12];
                    gastoBean.TipoGastoNombre = (string)dataReader[13];
                    listaGasto.Add(gastoBean);
                }

                dataReader.Close();

                return listaGasto;
            }
            catch (Exception ex)
            {
                log.Error("ListarGasto(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public string ModificarGasto(GastoBean gasto)
        {
            SqlConnection sqlCon = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "UPDATE documento_de_pago SET tipo_gasto = " + gasto.TipoGasto + ", tipo_documento_pago = " + gasto.TipoDocumentoPago +
                    ", Nro_Documento = '" + gasto.NumeroDocumento + "', Monto = " + gasto.Monto + ", id_proveedor = " + gasto.IdProveedor + ", descripcion = '" +
                    gasto.Descripcion + "' where id_documento = " + gasto.IdDocumento;
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();
                gasto.Conexion = "Bien";

            }

            catch (Exception ex)
            {
                log.Error("ModificarGastos(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }

            return gasto.Conexion;
        }

        public string EliminarGasto(GastoBean gasto)
        {
            SqlConnection sqlCon = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "UPDATE documento_de_pago SET Estado = 0 WHERE id_documento = "+ gasto.IdDocumento;
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

                gasto.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("EliminarGasto(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
            
            return gasto.Conexion;
        }

        public GastoBean GastoPagado(GastoBean gasto)
        {
            SqlConnection sqlCon = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                sqlCon = new SqlConnection(cadenaConfiguracion);
                sqlCon.Open();
                string commandString = "SELECT count(*) from documento_de_pago where Estado=2 and id_documento = " + gasto.IdDocumento;
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                dataReader.Read();
                int datos = (int)dataReader[0];

                GastoBean gastoPagado = new GastoBean();
                if (datos == 2)
                {
                    gastoPagado.Pagado = true;
                }
                else gastoPagado.Pagado = false;
                return gastoPagado;
            } catch (Exception ex)
            {
                log.Error("GastoPagado(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
        }
    }
}